CV

01:00 0 Comments A + a -

image

.

C# Inicjalizatory obiektów oraz kolekcji Automatycznie implementowane właściwości Typy anonimowe Lambda METODY CZĘŚCIOWE(PARTIAL METHODS)

14:09 0 Comments A + a -

Inicjalizatory obiektów oraz kolekcji
1 //inicjalizator kolekcji 2 List<string> auta = new List<string>{"Audi","Mercedes","BMW"};3 4 //standardowa inicjalizacja 5 List<string> auta1 = new List<string>();6 auta1.Add("Audi");7 auta1.Add("Mercedes");8 auta1.Add("BMW");

WoW   ależ odkrycie



Automatycznie implementowane właściwości

1 public string Device { get; set; } WOW2 3 ////a w c# 6.0 4 5 public string Device { get; set; }=”something”; WOW WOW 6

Typy anonimowe

var frankenstein = new {hair="black", skin="green", teethCount=64}

Metody rozszerzające


Metody te pozwalają rozszerzyć funkcjonalność typów już istniejących. Mogą być one zadeklarowane tylko w klasach statycznych. 

Przykład:

public static int ToInt32(this string s)
{
   return Convert.ToInt32(s) ;
}


Metoda ta poszerza możliwości typu string o nową metodę ToInt32 (działanie metody myślę, że nie wymaga dodatkowego tłumaczenia). To co wyróżnia tę metodę od innych jest słowo kluczowe this w parametrze. Dzięki takiej metodzie będzie możliwe użycie poniższego kodu:

string s = "1";
int i    = s.ToInt32();


Tym sposobem rozszerzyliśmy klasę string bez jawnego dziedziczenia z niej, co wcześniej było niewykonalne.


Wyrażenie Lambda


Wyrażenie to (zapisywane jako => ) pozwala rozszerzyć możliwości delegacji. Poniższy przykład demonstruje użyje wyrażenia Lambda:

class Program
{
   delegate void DemoDelegate();
   static void Main(string[] args)
   {
      DemoDelegate myDelegate = () => Console.WriteLine("Pierwsza metoda") ;
      myDelegate();
 
      myDelegate = () => Console.WriteLine("Druga metoda") ;
      myDelegate();
   }
}


.

Windows Live Writer Source Code Plugin

13:27 0 Comments A + a -

https://code.google.com/p/codeformatterpluginforwindowslivewriter/

.

C# Delegaty

13:12 0 Comments A + a -


1 printnij objPrintnij = new printnij(myWydruk);
2 printnij objPrintnij1 = delegate(string x) { Console.WriteLine(x.ToString()); };
3 printnij objPrintnij2 = (string x) => { Console.WriteLine(x); Console.WriteLine(x); };
4 objPrintnij("sssss");
5 objPrintnij2("rrrrrr");
6 objPrintnij1("hhhhhh");
7 Console.ReadLine();
8
9
10 }
11
12 private static void myWydruk(string s)
13 {
14 Console.WriteLine(s);
15 }

http://4programmers.net/C_sharp/Wprowadzenie/Rozdzia%C5%82_6

.

C# Iterators

12:14 0 Comments A + a -

static void Main()
{
Zoo theZoo = new Zoo();

theZoo.AddMammal("Whale");
theZoo.AddMammal("Rhinoceros");
theZoo.AddBird("Penguin");
theZoo.AddBird("Warbler");

foreach (string name in theZoo)
{
Console.Write(name + " ");
}
Console.WriteLine();
// Output: Whale Rhinoceros Penguin Warbler

foreach (string name in theZoo.Birds)
{
Console.Write(name + " ");
}
Console.WriteLine();
// Output: Penguin Warbler

foreach (string name in theZoo.Mammals)
{
Console.Write(name + " ");
}
Console.WriteLine();
// Output: Whale Rhinoceros

Console.ReadKey();
}

public class Zoo : IEnumerable
{
// Private members.
private List<Animal> animals = new List<Animal>();

// Public methods.
public void AddMammal(string name)
{
animals.Add(new Animal { Name = name, Type = Animal.TypeEnum.Mammal });
}

public void AddBird(string name)
{
animals.Add(new Animal { Name = name, Type = Animal.TypeEnum.Bird });
}

public IEnumerator GetEnumerator()
{
foreach (Animal theAnimal in animals)
{
yield return theAnimal.Name;
}
}

// Public members.
public IEnumerable Mammals
{
get { return AnimalsForType(Animal.TypeEnum.Mammal); }
}

public IEnumerable Birds
{
get { return AnimalsForType(Animal.TypeEnum.Bird); }
}

// Private methods.
private IEnumerable AnimalsForType(Animal.TypeEnum type)
{
foreach (Animal theAnimal in animals)
{
if (theAnimal.Type == type)
{
yield return theAnimal.Name;
}
}
}

// Private class.
private class Animal
{
public enum TypeEnum { Bird, Mammal }

public string Name { get; set; }
public TypeEnum Type { get; set; }
}
}
.

C# Genetic Types

09:59 0 Comments A + a -


class Generic<T>
{
    public void Add(T X)
    {
        Console.WriteLine("{0}", X);
    }
}

.

C# training agenda

09:10 0 Comments A + a -

http://www.comarch.pl/szkolenia/oferta-szkoleniowa/szkolenia-informatyczne/microsoft/nieautoryzowane/net/programowanie-net-kurs-zaawansowany/params/page/4/

Zaawansowane elementy języka C#

C# 2.0

•   Typy generyczne

•   Iteratory

•   Delegaty

•   Metody anonimowe

C# 3.0

•   Inicjalizatory obiektów oraz kolekcji

•   Automatycznie implementowane właściwości

•   Anonimowe typy, niejawne typowanie

•   Wyrażenia lambda, drzewa wyrażeń

•   Metody rozszerzające

•   LINQ

•   Metody częściowe

C# 4.0

•   Nazwane, opcjonalne parametry

•   Kowariancja i kontrawariancja

•   Dynamic (DLR)

C# 5.0

•   Metody asynchroniczne

Zawansowane elementy platformy .Net

•Refleksja

•Komunikacja rozporoszona  (WCF, Web API)

•Programowanie współbieżne (wątki, pule wątków, TPL, PLINQ)

•Programowanie asynchroniczne (APM, EAP, TAP)

•Programowanie aspektowe

•Programowanie funkcyjne

Wzorce projektowe

•Service Locator

•Dependency Injection

•Event Broker

Testy jednostkowe

Szablony T4

.

Codility:Prefix Sums:GenomicRangeQuery

05:40 0 Comments A + a -

A DNA sequence can be represented as a string consisting of the letters A, C, G and T, which correspond to the types of successive nucleotides in the sequence. Each nucleotide has an impact factor, which is an integer. Nucleotides of types A, C, G and T have impact factors of 1, 2, 3 and 4, respectively. You are going to answer several queries of the form: What is the minimal impact factor of nucleotides contained in a particular part of the given DNA sequence?

The DNA sequence is given as a non-empty string S = S[0]S[1]...S[N-1] consisting of N characters. There are M queries, which are given in non-empty arrays P and Q, each consisting of M integers. The K-th query (0 ≤ K < M) requires you to find the minimal impact factor of nucleotides contained in the DNA sequence between positions P[K] and Q[K] (inclusive).

For example, consider string S = CAGCCTA and arrays P, Q such that:

P[0] = 2 Q[0] = 4 P[1] = 5 Q[1] = 5 P[2] = 0 Q[2] = 6

The answers to these M = 3 queries are as follows:

  • The part of the DNA between positions 2 and 4 contains nucleotides G and C (twice), whose impact factors are 3 and 2 respectively, so the answer is 2.
  • The part between positions 5 and 5 contains a single nucleotide T, whose impact factor is 4, so the answer is 4.
  • The part between positions 0 and 6 (the whole string) contains all nucleotides, in particular nucleotide A whose impact factor is 1, so the answer is 1.

Assume that the following declarations are given:

struct Results { int * A; int M; };

Write a function:

struct Results solution(char *S, int P[], int Q[], int M);

that, given a non-empty zero-indexed string S consisting of N characters and two non-empty zero-indexed arrays P and Q consisting of M integers, returns an array consisting of M integers specifying the consecutive answers to all queries.

The sequence should be returned as:

  • a Results structure (in C), or
  • a vector of integers (in C++), or
  • a Results record (in Pascal), or
  • an array of integers (in any other programming language).

For example, given the string S = CAGCCTA and arrays P, Q such that:

P[0] = 2 Q[0] = 4 P[1] = 5 Q[1] = 5 P[2] = 0 Q[2] = 6

the function should return the values [2, 4, 1], as explained above.

Assume that:

  • N is an integer within the range [1..100,000];
  • M is an integer within the range [1..50,000];
  • each element of arrays P, Q is an integer within the range [0..N − 1];
  • P[K] ≤ Q[K], where 0 ≤ K < M;
  • string S consists only of upper-case English letters A, C, G, T.

Complexity:

  • expected worst-case time complexity is O(N+M);
  • expected worst-case space complexity is O(N), beyond input storage (not counting the storage required for input arguments).

Elements of input arrays can be modified. .

Codility C# Solution on Github

05:20 0 Comments A + a -

github-mark@1200x630https://github.com/cgorka/myCodilityNew

.

Codility:Prefix Sums:MinAvgTwoSlice

04:40 0 Comments A + a -

https://codility.com/programmers/task/min_avg_two_slice

A non-empty zero-indexed array A consisting of N integers is given. A pair of integers (P, Q), such that 0 ≤ P < Q < N, is called a slice of array A (notice that the slice contains at least two elements). The average of a slice (P, Q) is the sum of A[P] + A[P + 1] + ... + A[Q] divided by the length of the slice. To be precise, the average equals (A[P] + A[P + 1] + ... + A[Q]) / (Q − P + 1).

For example, array A such that:

A[0] = 4 A[1] = 2 A[2] = 2 A[3] = 5 A[4] = 1 A[5] = 5 A[6] = 8

contains the following example slices:

  • slice (1, 2), whose average is (2 + 2) / 2 = 2;
  • slice (3, 4), whose average is (5 + 1) / 2 = 3;
  • slice (1, 4), whose average is (2 + 2 + 5 + 1) / 4 = 2.5.

The goal is to find the starting position of a slice whose average is minimal.

Write a function:

int solution(int A[], int N);

that, given a non-empty zero-indexed array A consisting of N integers, returns the starting position of the slice with the minimal average. If there is more than one slice with a minimal average, you should return the smallest starting position of such a slice.

For example, given array A such that:

A[0] = 4 A[1] = 2 A[2] = 2 A[3] = 5 A[4] = 1 A[5] = 5 A[6] = 8

the function should return 1, as explained above.

Assume that:

  • N is an integer within the range [2..100,000];
  • each element of array A is an integer within the range [−10,000..10,000].

Complexity:

  • expected worst-case time complexity is O(N);
  • expected worst-case space complexity is O(N), beyond input storage (not counting the storage required for input arguments).

Elements of input arrays can be modified.

  image

https://codility.com/demo/results/trainingSJ8VA8-KKA/ .

Zanurkuj w Pythonie Dive Into Python

04:04 0 Comments A + a -

https://pl.wikibooks.org/wiki/Zanurkuj_w_Pythonie


https://upload.wikimedia.org/wikibooks/pl/5/5e/Zanurkuj_w_Pythonie.pdf
http://www.diveintopython.net/ .

Codility:PassingCars

02:19 0 Comments A + a -

A non-empty zero-indexed array A consisting of N integers is given. The consecutive elements of array A represent consecutive cars on a road.
Array A contains only 0s and/or 1s:
  • 0 represents a car traveling east,
  • 1 represents a car traveling west.
The goal is to count passing cars. We say that a pair of cars (P, Q), where 0 ≤ P < Q < N, is passing when P is traveling to the east and Q is traveling to the west.
For example, consider array A such that:
A[0] = 0 A[1] = 1 A[2] = 0 A[3] = 1 A[4] = 1
We have five pairs of passing cars: (0, 1), (0, 3), (0, 4), (2, 3), (2, 4).
Write a function:
int solution(int A[], int N);
that, given a non-empty zero-indexed array A of N integers, returns the number of pairs of passing cars.
The function should return −1 if the number of pairs of passing cars exceeds 1,000,000,000.
For example, given:
A[0] = 0 A[1] = 1 A[2] = 0 A[3] = 1 A[4] = 1
the function should return 5, as explained above.
Assume that:
  • N is an integer within the range [1..100,000];
  • each element of array A is an integer that can have one of the following values: 0, 1.
Complexity:
  • expected worst-case time complexity is O(N);
  • expected worst-case space complexity is O(1), beyond input storage (not counting the storage required for input arguments).
Elements of input arrays can be modified.



Bad c# solution O(N*N)
https://codility.com/demo/results/trainingY8472P-G8E/



Good soulution with prefixtabbe
https://codility.com/demo/results/trainingHTT7X4-EBE/













.

Codility:CountDiv

02:17 0 Comments A + a -

Write a function:

int solution(int A, int B, int K);

that, given three integers A, B and K, returns the number of integers within the range [A..B] that are divisible by K, i.e.:

{ i : A ≤ i ≤ B, i mod K = 0 }

For example, for A = 6, B = 11 and K = 2, your function should return 3, because there are three numbers divisible by 2 within the range [6..11], namely 6, 8 and 10.

Assume that:

  • A and B are integers within the range [0..2,000,000,000];
  • K is an integer within the range [1..2,000,000,000];
  • A ≤ B.

Complexity:

  • expected worst-case time complexity is O(1);
  • expected worst-case space complexity is O(1).
.

Codility:MissingInteger

04:00 0 Comments A + a -

Write a function:
int solution(int A[], int N);
that, given a non-empty zero-indexed array A of N integers, returns the minimal positive integer (greater than 0) that does not occur in A.
For example, given:
A[0] = 1 A[1] = 3 A[2] = 6 A[3] = 4 A[4] = 1 A[5] = 2
the function should return 5.
Assume that:
  • N is an integer within the range [1..100,000];
  • each element of array A is an integer within the range [−2,147,483,648..2,147,483,647].
Complexity:
  • expected worst-case time complexity is O(N);
  • expected worst-case space complexity is O(N), beyond input storage (not counting the storage required for input arguments).
Elements of input arrays can be modified.
image
image
https://codility.com/demo/results/trainingPNNDDK-MCG/
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MissingInteger
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
    public class Solution
    {
        public int solution(int[] A)
        {
            // write your code in C# 6.0 with .NET 4.5 (Mono)
            HashSet<int> set = new HashSet<int>(A);
            for (int i = 1; i <= A.Length + 1; i++)
            {
                if (!set.Contains(i))
                { return i; }
            }
            return -1;
        }
    }
}











.

Codility:PermCheck

01:34 0 Comments A + a -

image
image
public int solution(int[] A) { // write your code in C# 6.0 with .NET 4.5 (Mono) int N = A.Length; HashSet<int> wzorzecHashSet = new HashSet<int>(); for (int i = 1; i <= N + 1; i++) { wzorzecHashSet.Add(i); } HashSet<int> setA = new HashSet<int>(A); int SetCount = setA.Count; if (setA.SetEquals(wzorzecHashSet)) return 1; else { return 0; } }





https://codility.com/demo/results/trainingAD396N-95S/ .

Codility:FrogRiverOne

00:56 0 Comments A + a -

Task description

A small frog wants to get to the other side of a river. The frog is currently located at position 0, and wants to get to position X. Leaves fall from a tree onto the surface of the river.

You are given a non-empty zero-indexed array A consisting of N integers representing the falling leaves. A[K] represents the position where one leaf falls at time K, measured in seconds.

The goal is to find the earliest time when the frog can jump to the other side of the river. The frog can cross only when leaves appear at every position across the river from 1 to X. You may assume that the speed of the current in the river is negligibly small, i.e. the leaves do not change their positions once they fall in the river.

For example, you are given integer X = 5 and array A such that:

A[0] = 1 A[1] = 3 A[2] = 1 A[3] = 4 A[4] = 2 A[5] = 3 A[6] = 5 A[7] = 4

In second 6, a leaf falls into position 5. This is the earliest time when leaves appear in every position across the river.

Write a function:

def solution(X, A)

that, given a non-empty zero-indexed array A consisting of N integers and integer X, returns the earliest time when the frog can jump to the other side of the river.

If the frog is never able to jump to the other side of the river, the function should return −1.

For example, given X = 5 and array A such that:

A[0] = 1 A[1] = 3 A[2] = 1 A[3] = 4 A[4] = 2 A[5] = 3 A[6] = 5 A[7] = 4

the function should return 6, as explained above.

Assume that:

  • N and X are integers within the range [1..100,000];
  • each element of array A is an integer within the range [1..X].

Complexity:

  • expected worst-case time complexity is O(N);
  • expected worst-case space complexity is O(X), beyond input storage (not counting the storage required for input arguments).

Elements of input arrays can be modified.

 

def solution(X, A):
# write your code in Python 2.7
res =-1
# setOfj = [0] * X
setOfelements = set ()
for i in range(len(A)):
val = A[i]
if (val not in setOfelements) :
setOfelements.add(val)
if len(setOfelements)==X:
return i;



return res

 

 

 


 

https://codility.com/demo/results/training4NTMP7-25P/

http://codesays.com/2014/solution-to-frog-river-one-by-codility/

.

PermMissingElem

03:47 0 Comments A + a -

A zero-indexed array A consisting of N different integers is given. The array contains integers in the range [1..(N + 1)], which means that exactly one element is missing.

Your goal is to find that missing element.

Write a function:

int solution(int A[], int N);

that, given a zero-indexed array A, returns the value of the missing element.

For example, given array A such that:

A[0] = 2 A[1] = 3 A[2] = 1 A[3] = 5

the function should return 4, as it is the missing element.

Assume that:

  • N is an integer within the range [0..100,000];
  • the elements of A are all distinct;
  • each element of array A is an integer within the range [1..(N + 1)].

Complexity:

  • expected worst-case time complexity is O(N);
  • expected worst-case space complexity is O(1), beyond input storage (not counting the storage required for input arguments).

Elements of input arrays can be modified.

Copyright 2009–2015 by Codility Limited. All Rights Reserved. Unauthorized copying, publication or disclosure prohibited.

 

 

https://codility.com/demo/results/trainingQPZDKX-KUK/

solution with sum aritmetic progresion

https://codility.com/demo/results/trainingGTC7SM-K39/

 

python 

https://codility.com/demo/results/trainingV84JT6-DZ2/

using System; // you can also use other imports, for example: // using System.Collections.Generic; // you can write to stdout for debugging purposes, e.g. // Console.WriteLine("this is a debug message"); class Solution { public int solution(int[] A) { uint N = (uint)A.Length + 1; // suma ciagu od 1 do N o n elementach UInt64 total = (UInt64) N * (N + 1) / 2; foreach (uint value in A) { total = total-value; } return (int)total; } }

.

Platformy Szkoleniowe

00:57 0 Comments A + a -

image

http://www.pluralsight.com/

.

Codility:TapeEquilibrium

10:21 0 Comments A + a -

C#

https://codility.com/demo/results/trainingMVHECQ-EN6/

Python:

https://codility.com/demo/results/trainingTRK29D-NNZ/

Java:

 

https://codility.com/programmers/task/tape_equilibrium

Images

  using System;

namespace c
{
    class MainClass
    {
        public int solution(int[] A) {
            // write your code in C# 6.0 with .NET 4.5 (Mono)
            int N=A.Length;
            //int[] difrencesArray = new int[N];
            Int64 sumArray = 0;
            foreach (int i in A)
            {
                sumArray += i;
            }


            long sumFirst = A[0];
            long minDiffr = int.MaxValue;
            int SelectedP = -100;
            for (int P = 1; P < N; P++) {
                long sumLast = sumArray - sumFirst;

                long diffrence = Math.Abs(sumFirst - sumLast);
                if (diffrence < minDiffr) {
                    minDiffr = diffrence;
                    SelectedP = P;
                }
                sumFirst += A[P];



            }



            return (int)minDiffr;
        }
    }
}
.

hackerrank: Service Lane

06:42 0 Comments A + a -

image

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

class Solution {
static void Main(String[] args) {
/* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution */
string firstLine = Console.ReadLine();
string[] flineStrings = firstLine.Split(' ');
int N = int.Parse(flineStrings[0]); //freewal lenght
int T = int.Parse(flineStrings[1]); // nbr TestCases
string[] lineWithsStrings = Console.ReadLine().Split(' ');
int[] lineWiths = lineWithsStrings.Select(n => Convert.ToInt32(n)).ToArray();



for (int i = 0; i < T; i++)
{
string[] lineWithsSData = Console.ReadLine().Split(' ');
int start = int.Parse(lineWithsSData[0]);
int stop = int.Parse(lineWithsSData[1]);

int maxVehicle = 3;
for (int j = start; j <= stop; j++)
{
if (lineWiths[j] <= maxVehicle)
{
maxVehicle = lineWiths[j];
}
}




Console.WriteLine(maxVehicle);
}




}
}

.

Hackerrank: Staircase

03:00 0 Comments A + a -

Unknown


import sys

n = int(input())
for i in range(1,n+1):
print (" "*(n-i) + "#"*i)

 

.

Hackerrank: Diagonal Difference

14:08 0 Comments A + a -

Unknown
https://www.hackerrank.com/challenges/diagonal-difference
N=int(input())

matrix=[]
for i in range(N):
list1=input().split()
list1=list(map(int,list1))
matrix.append(list1)

sumd1=0
sumd2=0
for i in range(N):
sumd1+=matrix[i][i]

for i in range(N):
sumd2+=matrix[N-1-i][i]

print(abs(sumd1-sumd2))
.

Codility test

04:45 0 Comments A + a -

 

Images

http://blog.codility.com/2011/03/solutions-for-task-equi.html

 

https://codility.com/demo/results/demoSAZ7AN-2B8/

.

Competitive programming

03:24 0 Comments A + a -

image

Competitive programming

 

Algorithm contests were always a bit of “so what?” for me, but the truth is, I hadn’t really tried to participate in one of them or even tried a few problems more than a couple of hours.

At Christmas, I re-assessed how I spend my free time, and I decided that some changes were in order. Among the changes, I decided I would be doing some programming challenges every week.

I started with good old TopCoder and its ugly UI. I did some practice SRMs and followed a few tutorialsto refresh my mind. There are some very nice things about TopCoder:

Plugins

The existence of plugins that auto-generate testcases and the function signature allows you to focus solely on the algorithm. I’m currently usingmoj as it satifies my needs (it works with any text editor, and works with Java and C++), but I’ve gotten to know the more flexible CHelper. CHelper is for IntelliJ only, but works with more challenges sites: for Codeforces, CodeChef and TopCoderit autogenerates code and grabs the test cases. For any other programming challenge, you can enter the test cases into CHelper (input and output), and it will generate the checking code.

All in all, the pain of manually entering test cases for challenges from sites like HackerRank is alleviated by CHelper, but still the convenience of simply opening a problem in TopCoder and all the information you get is automatically translated into code is pretty sweet.

Tutorials

There are some very nice tutorials provided by members of the community. Assuming you know basic datastructures (read CLRS and/or Skiena’s design manual), I recommend going through the following:

  • Dynamic programming. If you’re confused about DP, first read this Quora answer, then the tutorial.

  • Binary search. Don’t expect the typical binary search on sorted arrays. This tutorial generalizes that algorithm over some ordered search space (vs array) and predicate (vs ≥).

  • Graphs 1, 2 and 3. Good to get the hang of common graph algorithms.

  • Tries. Very simple datastructure that is not that widely taught (I couldn’t find it on CLRS). There are other better tutorials for tries, though.

  • String algorithms. String search is an easy problem to describe, yet efficient algorithms aren’t trivial. I’m reading this one tomorrow.

Do not in any case limit yourself to this sample of tutorials! Take a look at the books I mentioned above and also at the list of tutorials in TopCoder.

Warning: don’t think you’ll just use one algorithm for each problem. Algorithms must be part of your toolbox when solving a challenge. I see these tutorials as presenting algorithm familiesthat you might be able to adapt to solve some parts of the challenges.

Solutions

Another nice thing about TopCoder is the existence of match editorials: summaries about each SRM problem, going from fully implemented solutions to some vague guidelines.

The solutions submitted by other members are also available. From the Arena plugin you can see some solutions, but I found this websiteto be pretty convenient to see the solutions of the contestants in each SRM.

I recommend only looking at the solutions once you have a working implementation yourself or you are really stuck.

Other competition sites

There are many programming challenges websites, each with its own repository of problems. Each site has its pros and cons, but I’ve decided to stick with TopCoder for the moment as I haven’t really seen any features from other websites that I miss.

Conclusion

The best thing is to dive in and practice often, and when there’s an opportunity to participate on a competition (there’s an SRM weekly), go and try it!

I upload my solutions to GitHub in case you want to check them out.

.